Google のソフトウェアエンジニアリング ― 持続可能なプログラミングを支える技術、文化、プロセス
本書の著者は、「ソフトウェアエンジニアリング」 を、組織が時間経過に応じてコードを構築し、保守するために用いるツールとプロセスすべてを含むものとすることを提案
プログラミングの時間積分ということ
コードベースを持続可能にし、ソフトウェアエンジニアリングの規律を厳格化する方法
3 つの根本的原則
時間と変化
スケールと発展
トレードオフとコスト
3 つの主要な側面
文化
プロセス
ツール
1 部 主題
1 章 ソフトウェアエンジニアリングとは何か
プログラミングとソフトウェアエンジニアリングの決定的な違い
時間、スケール、作用しているトレードオフ
持続可能性 → ソフトウェアエンジニアリングにおける持続可能性
Hyrum の法則が、ソフトウェアを時間変化させていくにあたっての議論の支配的要因
効率や熱力学においてはエントロピーを考慮する必要があるように、ソフトウェアの時間による変化や保守においてはこれを意識する必要
Google の本番環境システムは人類によって造られたもっとも複雑な機械
『SRE サイトリライアビリティエンジニアリング ― Google の信頼性を支えるエンジニアリングチーム』 参照
本書の大部分は、そのような機械を生み出す組織のスケールの複雑性と、その機械を稼働させ続けるためのプロセス
スケールのための Google の仕組み : チャーンルール、Beyoncé ルール
Google は 2006 年にコンパイラのアップデートで困難に直面 → 技術と組織の変化の必要性を認めてそこに注力
自動化、統合 / 一貫性、専門知識
左への移動 (シフトレフト) : 問題の早期発見がコストを下げる
意思決定
意思決定の入力としてすべての情報が定量化可能な場合とそうでない場合がある
ビルド時間増大が直接自身の苦痛につながらない状態になったら、ビルド時間を減らすインセンティブが働かなくなる事例
Jevons のパラドックスのよう
2 部 文化
2 章 チームでうまく仕事をするには
自身が制御可能な変数 = 自分自身
ソフトウェア開発はチームによる取り組み
謙虚、尊敬、信頼が重要 (HRT)
人は自身の進行中の作業を人に見られて批評されることに不安がある
Linus Torvalds などの英雄的な人の真の業績は、人々を導いて作業を協調させたこと
なぜ我々は個人を偶像化するのか? → 人間には、リーダーやロールモデルを探して真似ようとする自然の本能
不安から人は自身の作業を隠蔽しようとするが、隠蔽こそが大問題
早期発見
「早期に失敗し、高速に失敗し、頻繁に失敗せよ」
バス係数
知識の分散、集団的英知
早期のフィードバックループ
エンジニアには集中するための時間が必要だが、チームで協働できる環境も必要
社交スキルの三本柱 (= HRT)
人付き合いのゲーム (social game) をすることの威力を過小評価しないこと
失敗は選択肢の 1 つである
ときどき失敗するようなことがなかったとすれば、十分に革新的ではないか、十分にリスクを取っていないかのどちらか
非難なしのポストモーテム文化
Google 的であること (Googleyness)
3 章 知識共有
組織は、組織自体の問題の大半に対し答えることができて然るべき
その状態を達成するためには次の 2 つが必要
それらの問題の答えを知る専門家
専門家の知識を流通させるメカニズム
重要な点は、組織に学びの文化がなければならない
強固な学びの文化がなければ、知識の共有を阻む課題が出現してくる可能性
ソフトウェアエンジニアリングの中心にいるのは人間
つまり、コードは重要な成果物ではあるが、製品開発の小さな一部にすぎない
どんな専門家もかつては初心者
組織の成功は、組織が擁する人々の育成と、その人々への投資にかかっている
専門家からの一対一の個人向けアドバイスは非常に価値が高い
専門家が休暇等でいなくなることがあるし、スケールしない
ドキュメント化された知識は専門家よりスケーラブルで、チームのみならず全組織にまでスケールする
一方で、一対一のアドバイスに比べて一般的なものになる
保守コストもかかる
組織慣習的知識は、個々のチームメンバーの知識と、ドキュメント化されている知識との間にある間隙に存在
ドキュメント化された知識と人間の専門家の比較
組織慣習的知識とドキュメント化された知識は相互に補完し合う
学びの環境を促進するために心理的安全性が決定的に重要
自分には常に学ぶべきことがあると認識するのが重要
常に学び続けよ、常に質問し続けよ
文脈を理解せよ
Chesterton のフェンスの原則
知識の共有を促進するために質問をスケールさせる
知識の共有を促進するために自身の知識をスケールさせる
組織の知識をスケールさせる
リーダビリティ (Google) : コードレビューを通じての標準化されたメンター制度
4 章 公正のためのエンジニアリング
バイアスが原因で、時として Google は製品内でユーザーを公正に代表させることに失敗してきた
Google フォトの画像認識アルゴリズムが黒人の友人をゴリラと認識
自動補完が、攻撃的もしくは人種差別的な結果を返す
など
卓越したエンジニアであるためには、製品の設計と実装に多様な観点を持ち込むことにも気を配らなければならない
万人に向けて製品を開発できるところまで至るには、自分たちが代表しようとしている母集団の理解がまずは不可欠
最低でも、自身が対象とするユーザーを構成している母集団の統計学的属性を理解する必要
一般的な方法論では、多数派のユースケースをまず開発し、エッジケース (edge case) に対処する改善や機能を後回しにする
まず最初に注力しなければならないのは、最も困難もしくは低代表であるユースケース
5 章 チームリーダー入門
概要
伝統的な意味での 「管理」 は行わない : リーダーシップ、影響力、チームに仕えることに集中する
可能な場合は移譲する : DIY (Do It Yourself : 自前作業) は行わない
チームの着眼点、方向、速度に特に注意を払う
Google のリーダーシップ役職
2 種の異なる役職
マネジャー (Manager : 管理者) : 人員のリーダー (エンジニアリングマネジャー)
テックリード (Tech Lead) : 技術的取り組みを主導
職責は相当異なるが、非常に似たスキルを要する
両方の役職をテックリードマネジャー (Tech Lead Manager) という同一人物が兼ねることもある
ソフトウェア開発における IC 役職からリーダーシップ役職への異動
リーダーシップ役職におけるアンチパターン
成功を収めるリーダーシップとマネジメントのための建設的パターン
Google でリーダーシップ役職者に推奨されるヒントや秘訣
人は植物のようなもの
植物は、水や肥料について、それぞれ必要な量が異なる
ピープルマネジメントにおいては、人によってさまざまな動機づけ (motivation) と方向付け (direction) が必要
効果的に機能している組織は、individual contributor (IC) とピープルマネジャーの双方に生産的なキャリアパスを用意している
6 章 スケールするリーダー
エンジニアリング管理職の進路を引き続きたどっていく過程において、職務要件に見合う能力を発揮する方法
真に優れたリーダーへと自分をスケールさせるには 「リーダーシップの 3 つのいつでも」 が重要
7 章 エンジニアリング生産性の計測
エンジニアリングの生産性それ自体に専念する専門家のチームを擁することは非常に有用かつ重要
エンジニアリング生産性を計測すべき理由
計測にはコストがかかるので、計測する価値があるかどうかを判断する必要がある
計測する価値があるかどうかの検討
Google ではメトリクス作成の指針として GSM フレームワークを利用
3 部 プロセス
8 章 スタイルガイドとルール
プログラミング言語のスタイルガイドの全ルールが属するカテゴリーは概して 3 つ
危険を避けるためのルール
ベストプラクティスを強制するためのルール
一貫性を保証するためのルール
#書籍 #文献